#!/usr/bin/env python
# -*-coding: utf-8 -*-
# Filename: derivar_ticket.py

##
# Módulos del sistema
try:
    import pygtk
    pygtk.require("2.0")
    import gtk
    import gtk.glade
except ImportError, error:
    print error
    print "Necesitas la librería gráficas gtk+pygtk"

from datetime import datetime
##
# Modulos propios
try:
    from lib.database import GrupoDeResolucion, Clasificacion, Estado
    from gui.msj_retroalimentacion import MensajeDeError, MensajeDeAdvertencia
    from lib.funciones_utiles import close
except ImportError, error:
    print error
    print "Error en derivar_ticket.py"


class DerivarTicket:
    def __init__(self, padre, ticket):
        self.gladefile = "gui/ghhp.glade"
        self.wTree = gtk.glade.XML(self.gladefile,"DerivarTicket")
        # Establecemos el padre
        self.padre = padre
        self.window = self.wTree.get_widget("DerivarTicket")
        self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
        self.window.set_transient_for(self.padre.window)
        self.window.resize(600,500)
        self.un_dict = {"on_okbutton15_clicked": self.close,
                "on_cancelbutton14_clicked": self.derivar_ticket,
                "on_checkbutton21_toggled": self.reclasificar,
                "on_combobox4_changed": self.rearmar_combo_grupo}
        self.wTree.signal_autoconnect(self.un_dict)
        # Variables
        self.nro_ticket = self.wTree.get_widget("label686")
        self.clasificacion_actual = self.wTree.get_widget("label687")
        self.estado_actual = self.wTree.get_widget("label688")
        self.fecha_creacion = self.wTree.get_widget("label689")
        self.fecha_ultimo_cambio = self.wTree.get_widget("label690")
        self.grupo_asociado = self.wTree.get_widget("label691")
        self.descripcion_problema = self.wTree.get_widget("textview21")
        self.estado_nuevo = self.wTree.get_widget("label382")
        self.observacion = self.wTree.get_widget("textview11")
        self.combo_clasificacion = self.wTree.get_widget("combobox4")
        self.combo_clasificacion.set_model(gtk.ListStore(str))
        self.combo_grupo = self.wTree.get_widget("combobox5")
        self.combo_grupo.set_model(gtk.ListStore(str))
        self.lista_grupos = {}
        self.lista_clasificaciones = {}
        self.ticket = ticket
        # Armamos los combos
        self.datos_iniciales()
        self.armar_combos()

    def reclasificar(self, widget):
        if self.wTree.get_widget("checkbutton21").get_active():
            self.combo_clasificacion.set_sensitive(True)
            self.wTree.get_widget("label381").set_sensitive(True)
            consulta_clasificacion = Clasificacion.select()
            for clasificacion in consulta_clasificacion:
                self.lista_clasificaciones[clasificacion.nombre] = clasificacion
                self.combo_clasificacion.append_text(clasificacion.nombre)

            self.lista_grupos = {}
            self.limpiar_combo_grupos()
            clasificacion = self.tomar_valor_combo(2)
            for grupo in self.consulta_grupos:
                if (clasificacion in grupo.clasificaciones):
                    self.lista_grupos[grupo.nombre] = grupo
                    self.combo_grupo.append_text(grupo.nombre)
            self.combo_grupo.set_active(0)
        else:
            self.combo_clasificacion.set_sensitive(False)
            self.wTree.get_widget("label381").set_sensitive(False)

    def rearmar_combo_grupo(self, widget):
        self.limpiar_combo_grupos()
        self.lista_grupos = {}
        clasificacion = self.tomar_valor_combo(2)
        for grupo in self.consulta_grupos:
            if (clasificacion in grupo.clasificaciones):
                self.lista_grupos[grupo.nombre] = grupo
                self.combo_grupo.append_text(grupo.nombre)
        self.combo_grupo.set_active(0)

    def limpiar_combo_grupos(self):
        for i in xrange(0,len(self.combo_grupo.get_model())):
            self.combo_grupo.remove_text(i)

    def datos_iniciales(self):
        #Datos utiles del ticket
        self.nro_ticket.set_text(str(self.ticket.id))
        self.clasificacion_actual.set_text(
                self.ticket.historial_de_clasificacion[-1].clasificacion.nombre)
        self.fecha_creacion.set_text(self.ticket.fecha_creacion.strftime("%d-%m-%Y"))
        self.fecha_ultimo_cambio.set_text(
                self.ticket.historial_de_estado[-1].fecha.strftime("%d-%m-%Y"))
        self.estado_actual.set_text(self.ticket.historial_de_estado[-1].estado.nombre)
        self.grupo_asociado.set_text(self.ticket.grupo_de_resolucion.nombre)
        self.descripcion_problema.get_buffer().set_text(self.ticket.descripcion)
        self.estado_nuevo.set_text('Abierto Derivado')

    def armar_combos(self):
        """Llenará con los datos correspondientes los comboboxentry.

        Buscará en la base de dato los grupos de resolucion, las clasificaciones
        y los estados activos.

        Keyword arguments:
        """
        self.consulta_grupos = []
        # Llenamos el de los grupos
        self.consulta_grupos = GrupoDeResolucion.select()
        for grupo in self.consulta_grupos:
            if (self.ticket.historial_de_clasificacion[-1].clasificacion in
                    grupo.clasificaciones):
                self.lista_grupos[grupo.nombre] = grupo
                self.combo_grupo.append_text(grupo.nombre)
        self.combo_grupo.set_active(0)
        # Llenamos el de las clasificaciones
        clasificacion = self.ticket.historial_de_clasificacion[-1].clasificacion
        self.combo_clasificacion.append_text(clasificacion.nombre)
        self.lista_clasificaciones[clasificacion.nombre] = clasificacion
        self.combo_clasificacion.set_active(0)

    def derivar_ticket(self, ticket):
        observacion, bandera = self.datos_validos()
        if bandera:
            print "Datos para derivar"
            print observacion
            print self.tomar_valor_combo(1)
            print self.tomar_valor_combo(2)
            fecha_derivacion = datetime.now()
            if (self.tomar_valor_combo(2) ==
                    self.ticket.historial_de_clasificacion[-1].clasificacion):
                self.padre.padre.mesa_de_ayuda.derivarTicket(self.tomar_valor_combo(1),
                        fecha_derivacion,
                        observacion,
                        self.padre.padre.usuario_logueado,
                        self.ticket)
            else:
                self.padre.padre.mesa_de_ayuda.derivarTicket(self.tomar_valor_combo(1),
                        fecha_derivacion,
                        observacion,
                        self.padre.padre.usuario_logueado,
                        self.ticket,
                        self.tomar_valor_combo(2))
            self.window.destroy()
            # Ver si ponemos que se derivo con exito o no.

    def tomar_valor_combo(self, combo):
        diccionario = {1: [self.combo_grupo, self.lista_grupos],
                2: [self.combo_clasificacion, self.lista_clasificaciones]}

        model = diccionario[combo][0].get_model()
        index = diccionario[combo][0].get_active()
        if index and combo == 1:
            return diccionario[combo][1][model[index][0]]
        elif index and combo == 2:
            return diccionario[combo][1][model[index][0]]
        elif combo == 1 or combo ==2:
            return diccionario[combo][1][model[0][0]]

    def datos_validos(self):
        """Valida el campo Observaciones."""
        obs = self.observacion.get_buffer()
        start = obs.get_start_iter()
        end = obs.get_end_iter()
        if obs.get_text(start, end) != "":
            return obs.get_text(start, end), True
        else:
            msj = "Observacion no puede ser nulo en esta operacion."
            print msj
            msj_error = MensajeDeError(msj, self.window)
            msj_error.run()
            return "", False

    def close(self,widget):
        close(self.window)
